約 5,029,363 件
https://w.atwiki.jp/pcmemo/pages/28.html
WPF アプリケーションの終了 Application.Shutdownメソッドを呼ぶ 現在のApplicationオブジェクトは静的プロパティApplication.Currentから取得する Application.Current.Shutdown(); 添付プロパティ RectangleににCanvas添付プロパティで座標を設定する Rectangle r = new Rectangle(); Canvas.SetLeft(r, 10); Canvas.SetTop(r, 15); ScrollViewerのスクロールバー分を計算 水平・垂直スクロールバーを含めない内側のサイズを固定したいとき XAML ScrollViewer Name="scrvwr" Width="300" Height="200" Canvas Name="cnvs" Width="600" Height="400" /Canvas /ScrollViewer cs int vBarWidth = scrvwr.Width - (int)cnvs.ActuralWidth; //垂直スクロールバーの幅 int hBarHeight = scrvwr.Height - (int)cnvs.ActualHeight; //水平スクロールバーの高さ //ScrollViewerのサイズ変更 scrvwr.Width += vBarWidth; scrvwr.Height += hBarHeight; マウスイベント MouseMove中にマウス左ボタンが押されているかを取得 XAML Canvas Name="cnvs" MouseMove="cnvs_MouseMove" /Canvas cs public void cnvs_MouseMove(object sender, MouseEventArgs e){ if(e.LeftButton == MouseButtonState.Pressed){ //左ボタンが押されているときの処理 } } Polygonクラスの使い方 PointCollection PointsにPointをAddして座標を指定する Polygon p = new Polygon(); p.Points.Add(new Point(0, 0)); p.Points.Add(new Point(10, 0)); p.Points.Add(new Point(0, 10)); p.Fill = Brushes.Blue; //塗りつぶしの色 p.Stroke = Brushes.Black; //輪郭の色
https://w.atwiki.jp/atachi/pages/49.html
WPF時代のグラフィックス ビジュアルオブジェクト カスタムコントロール WPFでの画像の扱い グラフィックス関連のクラス構成 [#i1cf7c34] レンダリング シェイプ ブラシ ブラシの種類 ジオメトリ ジオメトリの描画 [#l2dbcfd6] レンダリング UIのレンダリング ビットマップのレンダリング WPF時代のグラフィックス WPFではボタンやツリービューなどのコントロールの外観を描画する方法に新しい方式を取り入れています。 これまでは、グラフィックスとしてピクセルの描画を行っていましたが、WPFではこれらがパスなどを用いたドローイング方式となりました。 ビジュアルオブジェクト WPFでは描画する領域をビジュアルオブジェクトと呼び、ビジュアルオブジェクトに対し描画関数により図形の描画を行います。 すべてのコントロールは1つから複数のビジュアルオブジェクトの組み合わせで描画されており、コントロール自身もビジュアルオブジェクトです。 ビジュアルオブジェクトは親子関係を構築することができます。 コントロール自身もビジュアルオブジェクトなので、ボタンの文字が表示される場所に画像を表示したり、ツリービューコントロールを表示することもできます。 予め用意されているWPFで使用できるコントロールはFrameworkElementのサブクラスです。 カスタムコントロール 自分で独自のコントロールを作成する場合、ソースコードで定義するにはFrameworkElementのサブクラスとして作成します。 WPFでの画像の扱い WPFではBitmapSourceのサブクラスを主に扱います。このクラスはWPFのコントロールやスタイルと共に使いやすいように様々なプロパティやインターフェースを持ったものです。 GDI+ではImageクラスを主に扱います。Imageクラスは画像そのものをデータとしてクラスにカプセル化したものでこのクラス自体は画像への操作などは行うことができません。 グラフィックス関連のクラス構成 Object └ DispathcerObject └ DependencyObject └ Freezable └ Animatable └ ImageSource ├ BitmapSource │ ├ BitmapFrame MSDN │ └ BitmapImage └ DrawingImage レンダリング DrawingVisualは図形などを描画するためのコンテキストや描画した図形情報を格納しています。 実際にDrawingVisualに図形を描画するにはDrawingVisualからDrawingContextを取得します。 DrawingVisual dv = new DrawingVisual(); using(DrawingContext dc = dv.RenderOpen()){ dc.DrawEllipse(Brushes.Red,null,new Point(0,0), 1,1); } シェイプ System.Windows.Shapes名前空間に属した形を描画するためのクラス群です。 シェイプはベクターグラフィックスなので、解像度の変更にもスムーズに適切な解像度で描画されます。 Rectangle 矩形 Ellipse 楕円 Line 直線 Path 曲線 Polygon 多角形 Polyline 閉じていない多角形 PolygonとPolylineは似ていますが、複数の直線で構成された図形がとじているか閉じていないかで異なります。 また、Pathは連続した直線・曲線となります。 ブラシ // 正方形の矩形 Rectangle rect = new Rectangle(); rect.Width = 75; rect.Height = 75; // 矩形を単色で塗りつぶす SolidColorBrush myBrush = new SolidColorBrush(Colors.Red); rect.Fill = myBrush; ブラシの種類 SolidColorBrush 単色塗りつぶし LinearGradientBrush 線形グラデーション塗りつぶし RadialGradientBrush 円形グラデーション塗りつぶし ImageBrush 画像による塗りつぶし(拡大・縮小・タイル) DrawingBrush VisualBrush ジオメトリ ジオメトリはドロー系ソフトの「パス」と考えるとわかりやすい。(Adobe Illustratorなど) ジオメトリによって描画した図形は、拡大・縮小を行う際にその都度、座標を変えて再描画する必要がない(自動的に計算される) また、イージングなどのアニメーションが可能で、始点と終点の座標を与えれば中割の描画は自動的に計算され表示される。 このような特徴を持ったジオメトリは、Geometry クラスを基点としたクラスツリーをとる。 図形の描画に関しては、Shapeと同じものが用意されている。 // Create a figure that describes a // line from (10,20) to (100,130). PathFigure myPathFigure = new PathFigure(); myPathFigure.StartPoint = new Point(10,20); myPathFigure.Segments.Add( new LineSegment(new Point(100,130), true /* IsStroked */ )); /// Create a PathGeometry to contain the figure. PathGeometry myPathGeometry = new PathGeometry(); myPathGeometry.Figures.Add(myPathFigure); // Display the PathGeometry. Path myPath = new Path(); myPath.Stroke = Brushes.Black; myPath.StrokeThickness = 1; myPath.Data = myPathGeometry; canvas1.Children.Add(myPath); ジオメトリの描画 ジオメトリをVisualObjectに描画するにはUIElementクラスである必要があります。 UIElementのサブクラスであるPathクラスを使用してジオメトリをCanvasに描画するのが一般的です。 // Display the PathGeometry. Path myPath = new Path(); myPath.Stroke = Brushes.Black; myPath.StrokeThickness = 1; myPath.Data = myPathGeometry; // ジオメトリを設定 canvas1.Children.Add(myPath); // XAMLなどで定義したCanvas レンダリング 画像のレンダリングには、作成する画像の目的によって2種類の方法があります。 1つ目がユーザーインターフェース用の画像の作成です。ユーザーインターフェースではどのような環境でも表示される事が望まれるため、表示環境(DPIなど)に影響されにくいような描画システムを必要とします。 2つ目がビットマップなどの画像を作成するためのレンダリングです。 こちらは主にマルチメディアのための画像です。 それぞれレンダリングするためのクラスが異なります。 前者は、System.Windows.Media名前空間に属しています。 後者は、System.Drawing名前空間に属しており、GDI+とよばれる描画ライブラリのラッパーです。 UIのレンダリング ボタンなどのフォームコントロールを表示するための画像はDrawingVisualクラスを使用します。 このクラスは画像作成のためのコンテキストを持っており、プログラムによって図形を描画した後、ビットマップとして画像を取得できます。 このコンテキストは画像や図形を描画するためのメソッドを備えているため、簡単に図形を作成することができます。 出来上がるのは1枚のビットマップであるため、マウスイベントなどの処理はできません。 DrawingVisual drawingVisual = new DrawingVisual(); // 描画用のコンテキストを取得 DrawingContext drawingContext = drawingVisual.RenderOpen(); // 矩形を描画 Rect rect = new Rect(new System.Windows.Point(160, 100), new System.Windows.Size(320, 80)); drawingContext.DrawRectangle(System.Windows.Media.Brushes.LightBlue, (System.Windows.Media.Pen)null, rect); // コンテキストを閉じる drawingContext.Close(); 次のようにすればビットマップとして描画した画像を取り出せます。 RenderTargetBitmap bmp = new RenderTargetBitmap(180, 180, 120, 96, PixelFormats.Pbgra32); bmp.Render(drawingVisual); ビットマップのレンダリング Bitmap myBitmap = new Bitmap(100, 100); // レンダリングするためのキャンバスを作成します。 // この例では「100×100」の画像を作成します。 Graphics g = Graphics.FromImage(myBitmap); // 描画用コンテキストの作成
https://w.atwiki.jp/wpfapp/pages/14.html
デザイナにドラッグ&ドロップでコントロールで配置していくのはMFCやWindows Formとそう変わらないがWPFにおいて、それはいくつかある配置方法の中の一つであり、各種の配置用コントロールが用意されている。入れ子関係を表現できるXMLでUI構造を定義するというWPFの特徴から推察できるとおり、各コントロールは入れ子にすることが可能。 DockPanel 上部にメニュー/ツールバー、下部にステータスバーといった一般的なWindowsアプリでお馴染みなレイアウトを構成する場合にお世話になるコントロール。 図解しないと解り辛いので、とりあえず判り易く解説しているサイトに誘導。 [WPF] WPF入門 ~レイアウト [DockPanel]~ http //blogs.wankuma.com/kzt/archive/2009/03/17/169777.aspx
https://w.atwiki.jp/nina_a/pages/58.html
カテゴリ「WPF」に属するページ一覧 WPF/Canvasによるドラッグ・アンド・ドロップ WPF/アニメーション WPF/ゴースト付きのドラッグ・アンド・ドロップ WPF/テンプレート WPF/ドラッグ・アンド・ドロップ WPF/バインディング WPF/依存プロパティ WPF/装飾レイヤー
https://w.atwiki.jp/atachi/pages/52.html
依存関係プロパティの基本実装 [#xa682a33] 依存関係プロパティの識別子を実装 [#i7e417dd] FrameworkPropertyMetadataで指定するメタデータについて [#a3e9a582] コレクションの依存関係プロパティ [#a4489562] 参考サイト コントロールを自作する場合に、コントロールが公開するプロパティは依存関係プロパティとして実装します。 依存関係プロパティとして実装すると、バインディングが使えるようになります。 リソース データ バインディング スタイル Animations メタデータのオーバーライド プロパティ値の継承 WPF デザイナーの統合 依存関係プロパティの基本実装 依存関係プロパティは次のようにDependencyPropertyを使用して値を管理します。 値の取得や設定はすべてGetValueメソッド/SetValueメソッドで行われます。 コントロールを使う側は、公開されているプロパティである依存関係プロパティだけしか見えません。 class MyCustomControl Control { // 依存関係プロパティの識別子 public static readonly DependencyProperty IsSpinningProperty = DependencyProperty.Register( "IsSpinning", // name 引数 typeof(Boolean), // propertyType 引数 typeof(MyCustomControl), // ownerType 引数 ); // 依存関係プロパティ public bool IsSpinning { get { return (bool)GetValue(IsSpinningProperty); } set { SetValue(IsSpinningProperty, value); } } } 依存関係プロパティの識別子を実装 DependencyProperty.Register()を使用して、 WPFが持つプロパティシステムにプロパティに関する情報を登録します。 引数名 設定内容例 説明 name "IsSpinning" プロパティシステムに登録するプロパティ名。 propertyType typeof(Boolean) プロパティの型情報。typeofを使って型情報を取り出す。 ownerType typeof(MyCustomControl) プロパティを定義したクラスの型情報。 typeMetadata new FrameworkPropertyMetadata(...) プロパティについての追加情報。FrameworkPropertyMetadata を使って指定する。省略可能。こちら validateValueCallback new ValidateValueCallback(...) プロパティの値についてのバリデーション。ValidateValueCallback を使って指定する。省略可能。 Registerの戻り値には依存関係プロパティに関する情報が含まれている。 依存関係プロパティに値を設定する場合や取得する場合はこのインスタンスをつかって行う。 このインスタンスは、public static readonlyで定義する必要がある。 FrameworkPropertyMetadataで指定するメタデータについて FrameworkPropertyMetadata を使用すると、プロパティに関する設定が行える。 プロパティの初期値 プロパティ変更時に呼び出されるコールバックメソッド WPFデザイナによるデザイン時の挙動 デフォルトのデータバインディングのモード VisualObjectツリーで親から子へのプロパティ継承 WPFデザイナに関係するプロパティがいくつかあります。 適切に設定することで、WPFデザイナ使用時のパフォーマンスがよくなります。 AffectsMeasureプロパティ値の変更時に、サイズ変更を伴うコントロールの再描画が必要。 AffectsArrangeプロパティ値の変更時に、サイズ変更を伴わない(自分より下階層のサイズ変更は許可)コントロールの再描画が必要。 AffectsRenderプロパティ値の変更時に、一切のサイズ変更が伴われないコントロールの再描画が必要。 コレクションの依存関係プロパティ カスタムコントロールのコンストラクタでSetValueを使ってsingletonなコレクション型インスタンスを作成する 依存関係プロパティ識別子は読み取り専用で登録する(DependencyProperty.RegisterReadOnly を使用する) class MyCustomControl Control { public MyCustomControl() base() { SetValue(ItemsPropertyKey, new List FrameworkElement () ); } private static readonly DependencyPropertyKey ItemsPropertyKey = DependencyProperty.RegisterReadOnly( "Items", typeof(List FrameworkElement ), typeof(MyCustomControl), new FrameworkPropertyMetadata(new List FrameworkElement ()) ); // 依存関係プロパティの識別子 public static readonly DependencyProperty IsSpinningProperty = DependencyProperty.Register( "IsSpinning", // name 引数 typeof(Boolean), // propertyType 引数 typeof(MyCustomControl), // ownerType 引数 ); public static readonly DependencyProperty ItemsProperty = ItemsPropertyKey.DependencyProperty; // 依存関係プロパティ public bool IsSpinning { get { return (bool)GetValue(IsSpinningProperty); } set { SetValue(IsSpinningProperty, value); } } public List FrameworkElement Items { get { return (List FrameworkElement )GetValue(ItemsProperty); } } } 参考サイト MSDN カスタム依存関係プロパティ
https://w.atwiki.jp/atachi/pages/33.html
コンテナ コントロール コントロールの作成 MSDNに説明があります。 MSDN コントロールの作成の概要 UserControlを使ってカスタムコントロールを作成する WPFデザイナを用いる UserControlのサブクラスを使う FrameworkElementのサブクラスを使う FrameworkElementを仕様したカスタムコントロールの作成 FrameworkElementはWPFで使用できるコントロールを実装するための最小限度の機能を持ったクラスで、WPFが提供する多くのコントロールでもスーパークラスとして使用しています。 FrameworkElementを使ってカスタムコントロールを作成する利点は、FrameworkElementのコンテキストに直接レンダリングを行える点です。アプリケーションが動的にグラフや図をレンダリングするためのコントロールを必要とする場合に特に有効です。
https://w.atwiki.jp/ryouga0415/pages/84.html
更新日:2010-03-08 WPF … Windows Presentation Foundation WPFを使ったGUIアプリケーションの開発は,Visual Studio 2008で可能になりました。 VS2008のSP1では、42個のコントロールが利用できる。 VS2010では、新たにCalender,DataGrid,DataPickerが追加され、44個のコントロールが利用できる。 ※既存のUniformGridは無くなった。 Calender … 色々な種類のカレンダーコントロールが利用可能に。 DataPicker … OSの日付と時刻のプロパティのようなコントロールが利用可能に。 WPFの特徴 従来からあるようなコードベースのAPIだけではなく、XAML(ザムル)と呼ばれるXMLによるプレゼンテーション 記述言語を利用することで、ASP.NETのようなコードビハインド機能を実現すること出来ます。 Microsoft Expression Blend WPFアプリケーションのUIをデザインするために利用可能なデザイナー向けのツール ※Microsoftのページより評価版(無料)がダウンロード可能 製品版は、購入が必要です。 製品版では、デザインだけでなく、Blendツール上でイベントの記述やデバックが可能 NUnit単体テストの自動実行を支援するツール Java用のテストツールである「JUnit」を元に.NETで利用可能にしたもの 最新バージョンは、NUnit2.5.2(http //sourceforge.net/projects/nunit/) Silverlightマイクロソフトが開発したインターネットブラウザ用のプラグイン VS2010より、標準でSilverlightアプリケーションの開発が可能になりました。 Silverlightの特徴標準技術との連携が容易で、JavaScriptより300~1000倍高速 SilverlightとWPFの違いSilverlight … マルチプラットフォーム、マルチブラウザで動作するブラウザ用プラグイン WPF … Windowsプラットフォーム(XP以降)で動作するwindowsアプリケーション用の技術 なぜXAML?Windowsフォームでは、画面のデザインは自動生成のためVS任せ。 WPFでは、XAMLを利用し、画面のデザインがデザインツールなどでも容易になった。
https://w.atwiki.jp/lmes2/pages/117.html
データソース操作 GridView クラス GridViewを配置する データバインド DataBind メソッド マルチレコード・コントロールへのデータバインド データソース SqlDataSource クラス SqlDataSource の配置 レコードを表示する レコードを更新する レコードを挿入する ObjectDataSource クラス DataSet と TableAdapter の配置 ObjectDataSource の配置 DB操作 サーバーエクスプローラ データベースへの接続の追加 新しいテーブルの追加 テーブルにデータを追加 System.Data.SqlClient 名前空間 基本セット System.Data.Odbc 名前空間 DBConnect・DBClose・DBGet(System.Data.Odbc 名前空間) .NET Framework クラス ライブラリ System.Data.Odbc 名前空間
https://w.atwiki.jp/wpfapp/pages/2.html
メニュー トップページ WPF概要 開発環境 コントロールの配置 メニュー リンク msdn C# によるプログラミング入門 e-manual(WPF) ここを編集
https://w.atwiki.jp/atachi/pages/32.html
データバインドの動作 [#k465c5ef] バインドソースの指定 [#rc75f3da] 親からの継承 [#kdff50ec] Binding.RelativeSource [#a581de89] バインドモード [#s700eb9b] OneWayモード [#v08ce3cd] TwoWayモード [#bf122f92] OneWayToSourceモード [#k20c3c47] バインドの実行タイミング [#yf730c72] PropertyChanged [#da09d538] LostFocus [#sed9262c] コレクションのバインド [#h8063c0d] コレクションビューの定義 [#f8ad5be9] 並べ替え・フィルタ・グルーピング [#ra1a06f4] データオブジェクトによるバインド [#t844cc8d] バインドターゲットとなるカスタムコントロールの作成 [#i709f888] WPFのデータバインディングは、データモデル側がプロパティの変更があったことを通知しないとバインドされないので注意が必要。(Adobe Flexのバインディングとはその仕組みがぜんぜん違うので、AdobeFlexお経験したことがある方は注意) バインドのタイミングについては、バインドのタイミング項を参照。 バインドする側(TextBoxなどのコントロール側)をバインドターゲットと呼び、バインドしたい値を持っているオブジェクトをバインドソースと呼ぶ。 MSDN バインディングの概要 MSDN Bindingクラス データバインドの動作 次のXAMLは、リストコントロールに色のリストを表示し選択された項目によって文字の背景色を変更するサンプルです。 リストコントロールと文字コントロールの間でデータバインドが成立しています。 StackPanel TextBlock Width="248" Height="24" Text="Colors " TextWrapping="Wrap"/ ListBox x Name="lbColor" Width="248" Height="56" ListBoxItem Content="Blue"/ ListBoxItem Content="Green"/ ListBoxItem Content="Yellow"/ ListBoxItem Content="Red"/ ListBoxItem Content="Purple"/ ListBoxItem Content="Orange"/ /ListBox TextBlock Width="248" Height="24" Text="You selected color " / TextBlock Width="248" Height="24" TextBlock.Text !-- TextBlockのText属性に関する設定を行うタグ -- Binding ElementName="lbColor" Path="SelectedItem.Content"/ /TextBlock.Text TextBlock.Background !-- TextBlockのBackground属性に関する設定を行うタグ -- Binding ElementName="lbColor" Path="SelectedItem.Content" / /TextBlock.Background /TextBlock /StackPanel Bindingタグがバインドを行うための記述で、 Binding ElementName="lbColor" Path="SelectedItem.Content"/ というのは、同一フォーム内のlbColorというコントロールをバインドするという意味となります。 バインドが実行された場合、SelectedItem.Contentの値をターゲット(TextBlock.TextまたはTextBlock.Background)に与えられます。 バインドが実行されるタイミングはListBoxの実装に含まれており、通常はいくつかの操作がバインド実行のトリガーとして機能する。 ListBoxではアイテムの選択状態が変更した時にバインドが実行される。 バインドソースの指定 バインドターゲットがバインドするバインドソースを指定する方法には次の方法があります。 FrameworkElement.DataContext 親要素からの継承 Bindingクラスの次のプロパティからいずれか Binding.Source Binding.ElementName Binding.RelativeSource 親からの継承 親要素の継承とは、次の例ではGrid要素内のButton要素は、親要素に設定されたDataContext属性を継承しているので、Source属性にバインドソースを指定する必要がありません。 Grid DataContext="{StaticResource myDataSource}" Button Text="{Binding Path=Name}" / /Grid ListBox.ItemsSource属性のようにコレクションをバインドソースとする場合にmyDataSourcesそのものをバインドする為にBinding.Sourceを省略して記述することができます。 Grid DataContext="{StaticResource myDataSources}" ListBox ItemsSource="{Binding}" ... /ListBox /Grid Binding.RelativeSource RelativeSourceマークアップ拡張を使用してバインドソースを設定できる。(マークアップ拡張) Binding.RelativeSourceの設定を行うために、RelativeSourceマークアップ拡張を使用しなければならないので記述が長くなってしまう。(*1) RelativeSourceには指定可能なバインドソースが次の3つから選ぶことができる。 Self 自分自身をバインドソースにする。 TemplatedParent テンプレート(ControlTemplate)の親をバインドソースにする。 FindAncestorモード 上記のものとは指定方法が異なる。 MSDNにはRelativeSourceプロパティについて次のような記述がされている。 バインディング ターゲットの位置に対して相対的な位置を指定することにより、バインディング ソースを取得または設定します。 Selfは自分自身をバインドソースとします。「{RelativeSource Self}」のように指定します。 TextBox Text="{Binding RelativeSource={RelativeSource Self}, Path=Width}" Width="23" / イメージ的には次のような形と同じ。 TextBox Name="text1" Text="{Binding ElementName=text1,Path=Width}" Width="23" / TextBoxにはWidthプロパティの値である「23」という文字が表示される。 TemplatedParentはテンプレート(ControlTemplate)を使用している場合に、テンプレートの親をバインドソースとして使用します。 Window x Class="WpfApplication1.MainWindow" xmlns="http //schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns x="http //schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="120" Width="250" Window.Resources Style TargetType="Button" Setter Property="Template" Setter.Value ControlTemplate TargetType="Button" Grid Ellipse Fill="{TemplateBinding Background}"/ ContentPresenter Content="{Binding RelativeSource= {RelativeSource TemplatedParent} , Path=Name }" / /Grid /ControlTemplate /Setter.Value /Setter /Style /Window.Resources WrapPanel Button Name="MyButton" Content="ぼたん" / Button Name="MyButton2" Content="ぼたん2" / /WrapPanel /Window 次のように表示が行われます。 #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (Binding_TemplatedParent.jpg) XAMLではButtonのContentには「ぼたん」または「ぼたん2」としていますが、StyleによってButtonコントロールのテンプレートはオーバーライドされます。 ControlTemplateのContentPresenter.Contentはバインディングを設定していますが、ここで設定した「{RelativeSource TemplatedParent}」はテンプレート対象であるButtonコントロールを指します。Buttonコントロールをバインドソースとするため、バインド対象はButton.Nameプロパティとなります。 TemplatedParentはControlTemplateでしか作用しません。 テンプレートを使用できるケースとして、ListBoxのItemTemplateがありますが、ItemTemplate内のDataTemplateでBindingを使用する場合、TemplatedParentを使用することはできません。(エラーや警告は出ません) FindAncestorモードでは指定した型が見つかるまでBindingから親へとオブジェクトツリーを遡りながらバインドソースを決定します。 FindAncestorモードでは、AncestorTypeプロパティに探したい型を指定します。(x Typeマークアップ拡張を使用してAncestorTypeの値を記述する) Grid Name="MyGrid" TextBlock Text="{Binding RelativeSource= {RelativeSource AncestorType= {x Type Grid} } ,Path=Name }" / /Grid TextBlockには「MyGrid」という文字が表示される。 バインドモード UIでバインドを使う場合、ほとんどのケースでバインドターゲットはUIになる。 TextBoxとデータ変数をバインドする場合は、ユーザーから入力した内容をデータ変数に値をコピーする(ターゲット→ソース方向)とシステムロジックによってデータ変数にセットされた値をTextBoxに表示するために値をコピーする(ソース→ターゲット方向)の両方向バインドを使うと値のやりとりが簡単です。そのため、TextBoxはデフォルトでバインドモードがTwoWayになっています。 OneWay ソース → ターゲット リードオンリーのUIに値を表示する場合に使用することが多い。 TwoWay ソース →← ターゲット TextBoxのように、ユーザーからの入力を受ける場合に使用することが多い。 OneWayToSource ソース ← ターゲット 通常のUIでは使用することはまれ。 OneWayモード バインドソースからバインドターゲットへのデータバインディングを行うモード。 値の設定は一方通行なので、アプリケーションのデータをUIに表示することができる。 TwoWayモード データを双方向バインドするモードです。 「ソース→ターゲット方向」へのバインドはPropertyChangeによって実行されます。 「ターゲット→ソース方向」へのバインドはターゲット側の設定内容によって実行タイミングが異なります。 下記のコードは、ListBoxとTextBoxがTwoWayモードでバインドされているので、TextBoxに色名(たとえば「Pink」)を入力するとListBoxへ入力値がバインドされます。 StackPanel TextBlock Width="248" Height="24" Text="Colors " TextWrapping="Wrap"/ ListBox x Name="lbColor" Width="248" Height="56" ListBoxItem Content="Blue"/ ListBoxItem Content="Green"/ ListBoxItem Content="Yellow"/ ListBoxItem Content="Red"/ ListBoxItem Content="Purple"/ ListBoxItem Content="Orange"/ /ListBox TextBlock Width="248" Height="24" Text="You selected color " / TextBlock Width="248" Height="24" TextBlock.Text Binding ElementName="lbColor" Path="SelectedItem.Content"/ /TextBlock.Text TextBlock.Background Binding ElementName="lbColor" Path="SelectedItem.Content" / /TextBlock.Background /TextBlock TextBox Height="24" x Name="textBox1" Width="120" TextBox.Text !-- 双方向にバインドを形成する -- Binding ElementName="lbColor" Path="SelectedItem.Content" Mode="TwoWay" / /TextBox.Text TextBox.Background Binding ElementName="lbColor" Path="SelectedItem.Content" / /TextBox.Background /TextBox /StackPanel 上記のコードは問題があります。それはTextBoxへ入力された値がListBoxにバインドするためのバインドの実行が行われないという問題です。TextBoxコントロールがバインドを実行するタイミングは、フォーカスを失った時なのでフォーカスが失われない間はバインドが実行されません。(バインドが実行されるタイミングについて) Binding ElementName="lbColor" Path="SelectedItem.Content" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" / このように設定すると、プロパティが変更される度にバインドが実行されます。 OneWayToSourceモード バインドターゲットからバインドソースへ値を代入する バインドの実行タイミング バインドが実行されるタイミングはBinding.UpdateSourceTriggerの値によって決定されます。 Explicit BindingExpression.UpdateSource()のコールでのみバインドが実行 LostFocus コントロールからフォーカスが失われたときにバインドが実行 PropertyChanged プロパティの変更時にバインドが実行 OneWayモードのデータバインディングではデフォルトでPropertyChangedによるバインディングです。 TwoWayモードのデータバインディングでは、UIの種類によってタイミングは異なります。TextBoxではユーザーからの入力はLostFocusによってバインドソースへバインドされます。 PropertyChanged このバインドタイミングでバインドを実行するには、バインドソース(バインドターゲット)が INotifyPropertyChanged を実装し、PropertyChangedEventHandlerイベントを適切に呼び出すように実装します。(データオブジェクトによるバインド) LostFocus フォーカスが失われたときにバインドを実行します。 TextBoxなどユーザーからの入力を伴うコントロールでは、このバインドタイミングがデフォルトに設定されています。 コレクションのバインド データバインディングではバインドソースのコレクションをバインドできます。 しかし、バインドソースのコレクションをそのままバインドターゲットへバインドせずに、コレクションビューを作成しバインドソースとして使用します。 コレクションビューを使用する理由として、UIへの表示を行う際に並べ替え、フィルタ、およびグルーピングなどの処理を必要とするためです。コレクションビューを使用することで、直接バインドソースのコレクションを操作することなしに、並び替えなどのコレクションを使用できます。 ただし、バインドソースとするコレクションはINotifyCollectionChanged インターフェースを実装する必要があります。 コレクションビューの定義 Window Window.Resources c MyData x Key="myDataSources"/ CollectionViewSource Source="{Binding Source={StaticResource myDataSources} }" x Key="listDataView1" / /Window.Resources ... /Window コレクションビューは同一のソースを複数定義することもできます。 並べ替え・フィルタ・グルーピング 並び替えを設定するにはSortDescriptions属性を設定します。 SortDescriptionはコレクションの要素が持つオブジェクトのプロパティをPropertyNameで指定します。 並び替えの対象フィールドは複数設定することが可能です。 CollectionViewSource Source="{Binding Source={StaticResource myDataSources} }" x Key="listDataView1" !-- 並び替え設定「SortDescriptions」 -- CollectionViewSource.SortDescriptions scm SortDescription PropertyName="Category" Direction="Ascending" / scm SortDescription PropertyName="Age" Direction="Descending" / /CollectionViewSource.SortDescriptions /CollectionViewSource scm名前空間は次のようにルート要素に設定して使用してください。 xmlns scm="clr-namespace System.ComponentModel;assembly=WindowsBase" グルーピングを設定するにはGroupDescriptions属性を指定します。 CollectionViewSource Source="{Binding Source={StaticResource myDataSources} }" x Key="listDataView1" CollectionViewSource.GroupDescriptions PropertyGroupDescription PropertyName="Category" / /CollectionViewSource.GroupDescriptions /CollectionViewSource データオブジェクトによるバインド バインド機能を使用するには、INotifyPropertyChangedインターフェースを実装したクラスが必要です。 class Person INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public String name { get { return _name; } set { _name = value; firePropertyChanged("name"); } } protected void firePropertyChanged(string name) { if( PropertyChanged != null ) { // デリゲートの実行 PropertyChanged(this, new PropertyChangedEventArgs(name) ); } } private String _name; } firePropertyChanged()はプロパティが変更したことを知らせるイベント(デリゲート)を実行するメソッドです。引数はバインドのパス名で、上記の場合「firePropertyChanged("name")」とはバインドするプロパティ名である。 テキストボックスのTextプロパティにバインドする。 TextBox Name="tb" Text="{Binding Path=name}" / プロパティがバインドすることを簡単に記述するにはBindingマークアップ拡張を使用する。 バインドされるソースを上記のTextBoxに設定する必要があります。 通常はDataContextに設定を行います。 public Form() { tb.DataContext = person; } private Person person = new Person(); またはXAMLではプロパティは継承される為、TextBoxの上位の要素のDataContextに設定します。 Window Grid TextBox Text="{Binding Path=name}" / /Grid /Window // XAMLの分離コード public MainWindow Window { public MainWindow() { InitializeComponent(); Perons obj = new Person(); this.DataContext = obj; obj.name = "星井美希"; } } バインドターゲットとなるカスタムコントロールの作成 カスタムコントロールの作成はUserControlやPanelといったクラスを継承して作成すればいい。 ただし、カスタムコントロールでバインディング使う場合やWPFデザイナから値を設定するカスタムコントロールを作る場合は、依存関係プロパティという方法でプロパティを実装する必要がある。 実質すべての公開プロパティは依存関係プロパティで実装しなければならない。 依存関係プロパティの実装についてはこちら。 class MyControl UserControl, INotifyPropertyChanged { public string Idol { get { return (string)GetValue(IdolProperty); } set { SetValue(IdolProperty, value); } } /// summary /// Identifies the Value dependency property. /// /summary public static readonly DependencyProperty IdolProperty = DependencyProperty.Register( "Idol", typeof(string), typeof(MyControl), new FrameworkPropertyMetadata( string.Empty, // 初期値 FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnIdolChanged) ) ); private static void OnIdolChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { Console.WriteLine("Call OnIdolChanged"); Console.WriteLine("\t 古い値={0}", e.OldValue); Console.WriteLine("\t 新しい値={0}",e.NewValue); } }